# 基于socket开发一个聊天程序，实现两端互相发送和接收消息
#                                                                                   1
# import socket
# s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# s.bind(('localhost', 9000))
# s.listen()
# conn, addr = s.accept()
# data = conn.recv(1024).decode()
# print(f'来自[{addr}],收到：{data}')
# conn.send(data.encode().upper())
# print('send done')
# conn.close()
# s.close()






# 基于tcp协议编写简单FTP程序，实现上传、下载文件功能，并解决粘包问题
#                                                                                 2
# import socket, os
# s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# s.bind(('localhost', 9000))
# s.listen()
# conut = 0
# while 1:
#     conn, addr = s.accept()
#     conut += 1
#     print(f'[{conut}]与[{addr}]客户端建立连接')
#     while 1:
#         data = conn.recv(1024).decode()
#         if not data:
#             print(f'与[{addr}]断开连接')
#             break
#         if data.startswith('get'):
#             file_name = data.split()[1]
#             if os.path.isfile(file_name):
#                 file_size = os.path.getsize(file_name)
#                 file_size_head = f'|{file_size}'.zfill(16)
#                 conn.send(file_size_head.encode())
#                 with open(file_name, 'rb') as f:
#                     for i in f:
#                         conn.send(i)
#                     f.close()
#                 print(f'文件{file_name}以传输，文件大小：{file_size}')
#             else:
#                 pass
#         else:
#             file_name = data
#             file_size_head = conn.recv(32).decode()
#             file_size = int(file_size_head.split('|')[1])
#             f = open(f'{file_name}.download', 'wb')
#             got_size = 0
#             while got_size < file_size:
#                 d = conn.recv(1024)
#                 got_size += len(d)
#                 f.write(d)
#             f.close()
#             print(f'文件{file_name}已接收，数据大小：{file_size}')






# 基于tcp socket，开发简单的远程命令执行程序，允许用户执行命令，并返回结果
#                                                                    3
# import socket, os
# s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# s.bind(('localhost', 9000))
# s.listen()
# conut = 0
# while 1:
#     conn, addr = s.accept()
#     conut += 1
#     print(f'[{conut}]和[{addr}]连接')
#     while 1:
#         cmd = conn.recv(1024).decode()
#         if not cmd:
#             print(f'与[{addr}]断开连接')
#             break
#         cmd_res = os.popen(cmd).read()
#         if not cmd_res:
#             print('输入有误')
#         cmd_size = int(len(cmd_res.encode()))
#         cmd_size_head = f'|{cmd_size}'.zfill(32)
#         conn.send(cmd_size_head.encode())
#         conn.send(cmd_res.encode())
#         print(f'指令：{cmd}，数据大小：{cmd_size}')





# 基于udp协议编写程序，实现功能
# 1.执行指定的命令，让客户端可以查看服务端的时间
# 2.执行指定的命令，让客户端可以与服务的的时间同步
#                                                        4
# import time, socket
# s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)    #初始化一个类 基于udp开发 不可靠传输
# s.bind(('localhost', 9000))                             #绑定ip和端口
#
# while 1:                                              #接收完一个数据后可继续接收
#     data, addr = s.recvfrom(1024)                       #接收数据 包括数据内容和数据来源
#     cmd = data.decode()                                 #解析数据内容
#     if cmd.startswith('get'):                              #判断数据内容
#         if cmd.split()[1]:
#             #ti = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())).encode()
#             ti = str(time.time()).encode()
#             s.sendto(ti, addr)                          #发送数据内容给目标地址
#             print(f'给[{addr}]发送：{ti}')
#
# s.close()




# 作业（只做了登录 没完成）
# 题目：开发一个支持多用户同时在线的FTP程序          TCP
# 要求：
# 允许单用户登录                                         （有不同用户）
# 每个用户有自己的家目录，且只能访问自己的家目录
# 对用户进行磁盘配额，每个用户的可用空间不同（选做）
# 允许用户在ftp server上随意切换目录
# 允许用户查看当前目录下的文件
# 允许上传和下载文件，并保证文件的一致性
# 文件传输过程中显示进度条
# 附加：支持文件的断点续传（选做）
# 开发的程序需符合PEP8开发规范，及专业的生产软件设计规范，包括目录、代码命名、功能接口等
# import socket, re, os
# s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# s.bind(('localhost', 9000))
# s.listen()
#
# conut = 0
# a = re.compile('\s+')
# while 1:
#     #   1.等待客户端传输信息 解析，如果是name开头  对信息进行登录操作检测
#     conn, addr = s.accept()
#     conut += 1
#     print(f'[{conut}]和[{addr}]连接')
#     while 1:
#         cmd = conn.recv(1024).decode()
#         print(cmd)
#         if cmd == '':
#             print(f'与[{addr}]断开连接')
#             break
#         cmd_list = a.split(cmd)
#         do_cmd = cmd_list[0]
#         if do_cmd == 'name':
#             d ={}
#             name = cmd_list[1]
#             paswd = cmd_list[2]
#      #   2.根据 name 检测是否存在此文件夹 存在进行下一步      不存在则回复客户端此账号不存在
#             if os.path.isdir(name):
#             # 3.进入此文件夹，对name。txt文件进行读取 ， 对内容进行整理
#                 f = open(os.path.join(os.getcwd(), 'alex')+r'\alex.txt', 'r')
#                 for i in f:
#                     i = i.strip().split()
#                     d[i[0]] = i[1]
#                 f.close()
#             #   4.检测paswd 是否与文件里的paswd相同 相同则给客户端回复登录成功  不相同则回复客户端密码错误
#                 if paswd == d['paswd']:
#                     msg = '登录成功'
#                     print(f'向[{addr}]输出:{msg}')
#                     conn.send(msg.encode())
#                     break
#                 else:
#                     msg = '密码错误'
#                     print(f'向[{addr}]输出:{msg}')
#                     conn.send(msg.encode())
#                     break
#
#             else:
#                 msg = '此账号不存在'
#                 print(f'向[{addr}]输出:{msg}')
#                 conn.send(msg.encode())
#                 break




